package com.lcredu.web;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.lang.reflect.Method;

/**
 * @author 黎长容
 * @date 2025-07-05 19:46
 */
public class BasicServlet extends HttpServlet {
    /**
     * 黎长容知识2
     * 模板设计模式 + 反射 + 动态绑定
     * 如果使用模板模式+反射+动态绑定要满足action的值要和方法名一致
     * 1. BasicServlet继承HttpServlet可以重写doPost方法
     * 2. 原servlet继承BasicServlet
     * 3. 去掉原servlet的doPost方法,当去访问doPost方法的时候会自动调用super.doPost
     * 4. Method method = this.getClass().getDeclaredMethod(action, HttpServletRequest.class, HttpServletResponse.class);
     * 这里根据反射可以获取正在调用的方法,getDeclaredMethod可以获取所有的方法,但是我这里提供了方法名和参数类型,所以能找到特定的方法
     * 5. method.invoke(this, request, response);
     * 根据反射进行方法调用
     */

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //黎长容知识4
        //解决中文乱码问题
        request.setCharacterEncoding("utf-8");
//        System.out.println("BasicServlet");
        //这里我们合并一下
        String action = request.getParameter("action");
//        System.out.println(action);
        try {
            //这里根据反射可以获取正在调用的方法
            Method method = this.getClass().getDeclaredMethod(action, HttpServletRequest.class, HttpServletResponse.class);
            //进行反射找到相对应的类调用方法
            method.invoke(this, request, response);
//            System.out.println("declaredMethod=" + method);
        } catch (Exception e) {
//            System.out.println("异常类型: " + e.getClass().getName());
//            if (e.getCause() != null) {
//                System.out.println("根本原因: " + e.getCause().getMessage());
//            } else {
//                System.out.println("异常信息: " + e.getMessage());
//            }
            throw new RuntimeException(e);
        }

    }

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doPost(req, resp);
    }
}
